package model

import (
	"time"
)

type FileMetadata struct {
	ID            int64      `gorm:"column:id;primary_key" json:"id"`
	OwnerID       int64      `gorm:"column:owner_id;not null;index:idx_owner_parent,priority:1" json:"owner_id"`
	ParentID      int64      `gorm:"column:parent_id;not null;default:0;index:idx_owner_parent,priority:2" json:"parent_id,omitempty"`
	Name          string     `gorm:"column:name;not null" json:"name"`
	NameUniqueKey string     `gorm:"column:name_unique_key;not null" json:"name_unique_key"`
	IsDir         bool       `gorm:"column:is_dir;default:false" json:"is_dir"`
	Size          int64      `gorm:"column:size;default:0" json:"size"`
	MimeType      string     `gorm:"column:mime_type" json:"mime_type,omitempty"`
	StorageKey    string     `gorm:"column:storage_key;index:idx_storage_key" json:"storage_key"` // 逻辑合并文件为空
	StorageEngine string     `gorm:"column:storage_engine;type:varchar(32);not null;default:'local'" json:"storage_engine"`
	ETag          string     `gorm:"column:etag" json:"etag,omitempty"`
	HashSHA256    string     `gorm:"column:hash_sha256;type:char(64);index:idx_hash_sha256" json:"hash_sha256,omitempty"`
	IsDeleted     bool       `gorm:"column:is_deleted;default:false;index:idx_deleted_at" json:"is_deleted"`
	DeletedAt     *time.Time `gorm:"column:deleted_at;index:idx_deleted_at" json:"deleted_at,omitempty"`
	CreatedAt     time.Time  `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt     time.Time  `gorm:"column:updated_at;default:CURRENT_TIMESTAMP" json:"updated_at"`
}

func (FileMetadata) TableName() string {
	return "file_metadata"
}

type FileShare struct {
	ID        int64     `gorm:"column:id;primary_key" json:"id"`
	FileID    int64     `gorm:"column:file_id;not null" json:"file_id"`
	OwnerID   int64     `gorm:"column:owner_id;not null" json:"owner_id"`
	Token     string    `gorm:"column:token;not null;unique" json:"token"`
	Password  string    `gorm:"column:password" json:"password,omitempty"`
	ExpiredAt time.Time `gorm:"column:expired_at" json:"expired_at,omitempty"`
	CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at"`

	// 关联关系
	File  *FileMetadata `gorm:"foreignKey:FileID;references:ID" json:"-"`
	Owner *User         `gorm:"foreignKey:OwnerID;references:ID" json:"-"`
}

func (FileShare) TableName() string {
	return "file_share"
}
